package unirio;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.swing.*;

import Dados.Dados;

@SuppressWarnings("serial")
public class Main extends JFrame {
	
    private static Main m;
    
    private JMenuBar menuBar;
    private JMenu mImportar, mConsultar;
    private JMenuItem miImportarProdutos,miImportarPrecos,miImportarVendas,miImportarVendedores;
    private JMenuItem miConsultarTotaisMensal, miConsultarTotaisAcumulado, miConsultarMedias;
    
    public static Main getInstance() {
        if (m == null){
            m = new Main();
        }
        return m;
    }

    public Main(){
    
    	Dados.initData();
    	SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    	
    	menuBar = new JMenuBar();
    	setJMenuBar (menuBar);
    	
    	mImportar = new JMenu("Importar");
        mConsultar = new JMenu("Consultar");
        
        //criando itens do menu 1 da aplicacao
    	miImportarProdutos = new JMenuItem("Importar Produtos");
    	miImportarPrecos = new JMenuItem("Importar Precos");
    	miImportarVendas = new JMenuItem("Importar Vendas");
    	miImportarVendedores = new JMenuItem("Importar Vendedores");
    	
        //criando itens do menu 2 da aplicacao
        miConsultarTotaisMensal = new JMenuItem("Totais Mensal");
    	miConsultarTotaisAcumulado = new JMenuItem("Totais Acumulado");
    	miConsultarMedias = new JMenuItem("Medias");

        //Action Listeneners para carregar dados dos TXTs
        miImportarProdutos.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                chooser.showOpenDialog(null);
                File sf = chooser.getSelectedFile();
                ReadCSV.ReadCSV(sf.getAbsolutePath(),"Produtos");
                JOptionPane.showMessageDialog(null, "Produtos carregados com sucesso.");
            }
        });

        miImportarPrecos.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                chooser.showOpenDialog(null);
                File sf = chooser.getSelectedFile();
                ReadCSV.ReadCSV(sf.getAbsolutePath(),"Precos");
                JOptionPane.showMessageDialog(null, "Precos carregados com sucesso.");
                }
        });

        miImportarVendas.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                chooser.showOpenDialog(null);
                File sf = chooser.getSelectedFile();
                ReadCSV.ReadCSV(sf.getAbsolutePath(),"Vendas");
                JOptionPane.showMessageDialog(null, "Vendas carregadas com sucesso.");
            }
        });

        miImportarVendedores.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                chooser.showOpenDialog(null);
                File sf = chooser.getSelectedFile();
                ReadCSV.ReadCSV(sf.getAbsolutePath(),"Vendedores");
                JOptionPane.showMessageDialog(null, "Vendedores carregados com sucesso.");
            }
        });

        //Action Listeners para tratar popups de alguns itens de menu
        miConsultarTotaisMensal.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                
                //crio nova janela para pegar dados do usuario
                JFrame frame = new JFrame();
                Float precoProduto;

                String mesAte = JOptionPane.showInputDialog(
                    frame, 
                    "Digite o Mes (exemplo 01):", 
                    "Data de Entrada", 
                    JOptionPane.INFORMATION_MESSAGE
                );

                String anoAte = JOptionPane.showInputDialog(
                    frame, 
                    "Digite o Ano (exemplo 2014):", 
                    "Data de Entrada", 
                    JOptionPane.INFORMATION_MESSAGE
                    );
                
                //se um dos valores nao foi preenchido, return
                if (mesAte.equals("") || anoAte.equals("")){
                        return;
                }

                //pego elementos
                Enumeration eVendas = Dados.vendas.elements();
                Enumeration eVendasKeys = Dados.vendas.keys();
                Enumeration eVendedores = Dados.vendedores.elements();

                String[] vendedorArray = new String[3];
                Hashtable vendedoresCat1 = new Hashtable();
                Hashtable vendedoresCat2 = new Hashtable();

                // criando hashtable dos vendedores com as informacoes dos precos acumulados por mes/ano por vendedor
                while (eVendedores.hasMoreElements()) {
                    
                    //Coloco elementos em um array e separo por categoria do vendedor
                    String[] vendedor = (String []) eVendedores.nextElement();
                    if (vendedor[2].equals("1")){
                            vendedoresCat1.put(vendedor[1], 0);
                    }
                    else if (vendedor[2].equals("2")){
                            vendedoresCat2.put(vendedor[1], 0);
                    }
                }

                while (eVendas.hasMoreElements()) {
                    
                    String[] venda = (String []) eVendas.nextElement();
                    
                    String vendaData = venda[0];
                    String vendaQuantidade = venda[1];
                    String vendaCodigoProduto = venda[2];
                    String vendaCodigoVendedor = venda[3];

                    // pegar mes e ano da venda
                    String mesVenda = vendaData.substring(3,5);
                    String anoVenda = vendaData.substring(6,10);

                    int dataAte = Integer.parseInt(anoAte + mesAte); //dado do usuario
                    int dataVenda = Integer.parseInt(anoVenda + mesVenda); //dado do cadastro
                    
                    if (dataVenda == dataAte){

                        // verifica se existe cadastro do vendedor
                        if (Dados.vendedores.containsKey(vendaCodigoVendedor)){

                            // pega informacoes do vendedor
                            vendedorArray = (String []) Dados.vendedores.get(vendaCodigoVendedor);
                            //pega nome do vendedor
                            String vendedorNome = vendedorArray[1];
                            //pega categoria do vendedor
                            String vendedorCategoria = vendedorArray[2];

                            precoProduto = new Float(0.00);
                            precoProduto = PrecoProduto(vendaCodigoProduto, vendaData);
                            precoProduto = precoProduto * Float.parseFloat(vendaQuantidade);

                            //vai somando os precos vendidos pelo vendedor, por categoria
                            if (vendedorCategoria.equals("1")){
                                    precoProduto = precoProduto + Float.parseFloat(vendedoresCat1.get(vendedorNome).toString());
                                    vendedoresCat1.put(vendedorNome, precoProduto);
                            }
                            else if (vendedorCategoria.equals("2")){
                                precoProduto = precoProduto + Float.parseFloat(vendedoresCat2.get(vendedorNome).toString());
                                vendedoresCat2.put(vendedorNome, precoProduto);
                            }
                        }
                    }
                }

                ImpressaoResultados ir = new ImpressaoResultados();
                ir.ImpressaoResultados(vendedoresCat1,vendedoresCat2,0);
            }
        });

        miConsultarTotaisAcumulado.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {

                //crio nova janela para pegar dados do usuario
                JFrame frame = new JFrame();
                Float precoProduto;

                String mesDe = JOptionPane.showInputDialog(
                    frame, 
                    "Digite o Mes Inicial (exemplo 01):", 
                    "Data de Entrada", 
                    JOptionPane.INFORMATION_MESSAGE
                );

                String anoDe = JOptionPane.showInputDialog(
                    frame, 
                    "Digite o Ano Inicial (exemplo 2014):", 
                    "Data de Entrada", 
                    JOptionPane.INFORMATION_MESSAGE
                );

                String mesAte = JOptionPane.showInputDialog(
                    frame, 
                    "Digite o Mes Final (exemplo 01):", 
                    "Data de Entrada", 
                    JOptionPane.INFORMATION_MESSAGE
                );

                String anoAte = JOptionPane.showInputDialog(
                    frame, 
                    "Digite o Ano Final (exemplo 2014):", 
                    "Data de Entrada", 
                    JOptionPane.INFORMATION_MESSAGE
                );
                    
                //se um dos valores nao foi preenchido, return
                if (mesDe.equals("") || anoDe.equals("") || mesAte.equals("") || anoAte.equals("")){
                    return;
                }

                Enumeration eVendas = Dados.vendas.elements();
                Enumeration eVendedores = Dados.vendedores.elements();

                String[] vendedorArray = new String[3];
                Hashtable vendedoresCat1 = new Hashtable();
                Hashtable vendedoresCat2 = new Hashtable();

                // criando hashtable dos vendedores com as informacoes dos precos acumulados por mes/ano por vendedor
                while (eVendedores.hasMoreElements()) {
                    String[] vendedor = (String []) eVendedores.nextElement();
                    if (vendedor[2].equals("1")){
                            vendedoresCat1.put(vendedor[1], 0);
                    }
                    else if (vendedor[2].equals("2")){
                            vendedoresCat2.put(vendedor[1], 0);
                    }  
                }

                while (eVendas.hasMoreElements()) {
                    String[] venda = (String []) eVendas.nextElement();
                    String vendaData = venda[0];
                    String vendaQuantidade = venda[1];
                    String vendaCodigoProduto = venda[2];
                    String vendaCodigoVendedor = venda[3];

                    // pegar mes e ano da venda
                    String mesVenda = vendaData.substring(3,5);
                    String anoVenda = vendaData.substring(6,10);

                    // se for ano e mes digitado pela consulta entra no if
                    int dataAte = Integer.parseInt(anoAte + mesAte);
                    int dataDe = Integer.parseInt(anoDe + mesDe);
                    int dataVenda = Integer.parseInt(anoVenda + mesVenda);	
                    
                    if (dataVenda >= dataDe && dataVenda <= dataAte){

                        // verifica se existe cadastro do vendedor
                        if (Dados.vendedores.containsKey(vendaCodigoVendedor)){

                            // pega informacoes do vendedor
                            vendedorArray = (String []) Dados.vendedores.get(vendaCodigoVendedor);
                            //pega nome do vendedor
                            String vendedorNome = vendedorArray[1];
                            //pega categoria do vendedor
                            String vendedorCategoria = vendedorArray[2];

                            precoProduto = new Float(0.00);
                            precoProduto = PrecoProduto(vendaCodigoProduto, vendaData);
                            precoProduto = precoProduto * Float.parseFloat(vendaQuantidade);

                            //vai somando os precos vendidos pelo vendedor.
                            if (vendedorCategoria.equals("1")){
                                precoProduto = precoProduto + Float.parseFloat(vendedoresCat1.get(vendedorNome).toString());
                                vendedoresCat1.put(vendedorNome, precoProduto);
                        }
                        else if (vendedorCategoria.equals("2")){
                                precoProduto = precoProduto + Float.parseFloat(vendedoresCat2.get(vendedorNome).toString());
                                        vendedoresCat2.put(vendedorNome, precoProduto);
                        }
                    }
                }
            }

            ImpressaoResultados ir = new ImpressaoResultados();
            ir.ImpressaoResultados(vendedoresCat1,vendedoresCat2,0);
        }
    });

    miConsultarMedias.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {

            //crio nova janela para pegar dados do usuario
            JFrame frame = new JFrame();
            Float precoProduto;

            String mesDe = JOptionPane.showInputDialog(
                frame, 
                "Digite o Mes Inicial (exemplo 01):", 
                "Data de Entrada", 
                JOptionPane.INFORMATION_MESSAGE
            );

            String anoDe = JOptionPane.showInputDialog(
                frame, 
                "Digite o Ano Inicial (exemplo 2014):", 
                "Data de Entrada", 
                JOptionPane.INFORMATION_MESSAGE
            );

            String mesAte = JOptionPane.showInputDialog(
                frame, 
                "Digite o Mes Final (exemplo 01):", 
                "Data de Entrada", 
                JOptionPane.INFORMATION_MESSAGE
            );

            String anoAte = JOptionPane.showInputDialog(
                frame, 
                "Digite o Ano Final (exemplo 2014):", 
                "Data de Entrada", 
                JOptionPane.INFORMATION_MESSAGE
            );

            //se um dos valores nao foi preenchido, return
            if (mesDe.equals("") || anoDe.equals("") || mesAte.equals("") || anoAte.equals("")){
                return;
            }

            Enumeration eVendas = Dados.vendas.elements();
            Enumeration eVendedores = Dados.vendedores.elements();

            String[] vendedorArray = new String[3];
            Hashtable vendedoresCat1 = new Hashtable();
            Hashtable vendedoresCat2 = new Hashtable();
            Hashtable mesesQuantidade = new Hashtable();

            // criando hashtable dos vendedores com as informacoes dos precos acumulados por mes/ano por vendedor
            while (eVendedores.hasMoreElements()) {
                String[] vendedor = (String []) eVendedores.nextElement();
                if (vendedor[2].equals("1")){
                        vendedoresCat1.put(vendedor[1], 0);
                }
                else if (vendedor[2].equals("2")){
                        vendedoresCat2.put(vendedor[1], 0);
                }  
            }

            while (eVendas.hasMoreElements()) {
                String[] venda = (String []) eVendas.nextElement();
                
                String vendaData = venda[0];
                String vendaQuantidade = venda[1];
                String vendaCodigoProduto = venda[2];
                String vendaCodigoVendedor = venda[3];

                // pegar mes e ano da venda
                String mesVenda = vendaData.substring(3,5);
                String anoVenda = vendaData.substring(6,10);

                // se for ano e mes digitado pela consulta entra no if
                int dataAte = Integer.parseInt(anoAte + mesAte);
                int dataDe = Integer.parseInt(anoDe + mesDe);
                int dataVenda = Integer.parseInt(anoVenda + mesVenda);	
                
                if (dataVenda >= dataDe && dataVenda <= dataAte){

                // cada mes/ano diferente de venda e adicionado na tabela hash.
                mesesQuantidade.put(dataVenda, 0);

                // verifica se existe cadastro do vendedor
                if (Dados.vendedores.containsKey(vendaCodigoVendedor)){

                    // pega informacoes do vendedor
                    vendedorArray = (String []) Dados.vendedores.get(vendaCodigoVendedor);
                    //pega nome do vendedor
                    String vendedorNome = vendedorArray[1];
                    //pega categoria do vendedor
                    String vendedorCategoria = vendedorArray[2];

                    precoProduto = new Float(0.00);
                    precoProduto = PrecoProduto(vendaCodigoProduto, vendaData);
                    precoProduto = precoProduto * Float.parseFloat(vendaQuantidade);

                    //vai somando os precos vendidos pelo vendedor.
                    if (vendedorCategoria.equals("1")){
                        precoProduto = precoProduto + Float.parseFloat(vendedoresCat1.get(vendedorNome).toString());
                        vendedoresCat1.put(vendedorNome, precoProduto);
                    }
                    else if (vendedorCategoria.equals("2")){
                        precoProduto = precoProduto + Float.parseFloat(vendedoresCat2.get(vendedorNome).toString());
                        vendedoresCat2.put(vendedorNome, precoProduto);
                    }
                }
            }
        }

        ImpressaoResultados ir = new ImpressaoResultados();
        ir.ImpressaoResultados(vendedoresCat1,vendedoresCat2,mesesQuantidade.size());
    }
});

    mImportar.add(miImportarProdutos);
    mImportar.add(miImportarPrecos);
    mImportar.add(miImportarVendas);
    mImportar.add(miImportarVendedores);
    mConsultar.add(miConsultarTotaisMensal);
    mConsultar.add(miConsultarTotaisAcumulado);
    mConsultar.add(miConsultarMedias);

    menuBar.add(mImportar);
    menuBar.add(mConsultar);

    getContentPane().add(menuBar,BorderLayout.NORTH);

    setTitle("Trabalho PM - Vendas");
    setResizable(false);
    setSize(400,400);
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    addWindowListener(new WindowListener());
    setLocationRelativeTo(null); // centraliza a janela 
}

public class WindowListener extends WindowAdapter{  
    public void windowClosing( WindowEvent e ){  
        int opcao= JOptionPane.showOptionDialog(null,   
            "Deseja fechar o Programa?", "Trabalho PM - Vendas",   
            JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);   

         if (opcao == 0) {   
             System.exit(0);   
        }  
    }  
}  

public static void main(String[] args) {
getInstance().setVisible(true);
}

public float PrecoProduto(String vendaCodigoProduto, String sVendaData){

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
float precoProduto = new Float (0.00);
String sDataMaior = "01/01/1900";
Enumeration ePrecos = Dados.precos.elements();

while (ePrecos.hasMoreElements()) {
    String[] dadosPreco = (String []) ePrecos.nextElement();
    String data = dadosPreco[0];
    String codigo = dadosPreco[1];
    String preco = dadosPreco[2];

    if (vendaCodigoProduto.equals(codigo)){

        try {

            Date dataMaior = formatter.parse(sDataMaior);
            Date vendaData = formatter.parse(sVendaData);
            Date produtoData = formatter.parse(data);

            // pegar o valor do produto com a maior data de vigencia antes da data da venda
            if (produtoData.compareTo(dataMaior)>=0 && produtoData.compareTo(vendaData)<=0){
                sDataMaior = formatter.format(produtoData).toString();
                precoProduto = Float.parseFloat(preco);
            }

        } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }

    }
}
    	
    	return precoProduto;
    }
}